package pl.edu.pw.elka.jtrzasko.proz.warcaby.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import pl.edu.pw.elka.jtrzasko.proz.warcaby.controller.ClientController;
import pl.edu.pw.elka.jtrzasko.proz.warcaby.controller.Server;
import pl.edu.pw.elka.jtrzasko.proz.warcaby.figures.FigureColor;
import pl.edu.pw.elka.jtrzasko.proz.warcaby.messages.client.ClientMessage;
import pl.edu.pw.elka.jtrzasko.proz.warcaby.messages.client.ClientMessageClick;
import pl.edu.pw.elka.jtrzasko.proz.warcaby.model.Position;

/**
 * Klasa towrzaca caly w idok dla pojedynczego klienta. Zawiera plansze do gry
 * oraz wszytkie niezbedne opcje do polaczenia z serwerem.
 */
public class ClientView extends JPanel
{
	/**
	 * Glowny panel gry zawierajacy plansze do gry
	 */
	private JPanel boardPanel;
	/**
	 * Zawiera zestaw komponentow sluzacych do laczenia z serwerem
	 * Wyswietla informacje o stanie gry
	 */
	private JPanel rightPanel;
	/**
	 * Tablica poszczegolnych pol na planszy
	 */
	private JPanel[][] boardPanels;
	private JLabel labelServerIP;
	private JLabel labelServerPort;
	private JLabel labelClientColor;
	private JLabel labelClientStatus;
	/**
	 * Zawiera adres IP Serwera do kotrego sie podlaczamy
	 */
	private JTextField textServerIP;
	/**
	 * Zawiera port na ktorym laczymy sie z serwerem
	 */
	private JTextField textServerPort;
	/**
	 * Wyswietla kolor pinkow tego klienta
	 */
	private JTextField textClientColor;
	/**
	 * Wyswietla informacje o stanie gry
	 */
	private JTextField textClientStatus;
	/**
	 * Nawiazuje polaczenie z serwerem
	 */
	private JButton buttonConnect;
	/**
	 * Rozlaczenie polaczenia z serwerem
	 */
	private JButton buttonDisconnect;

	/**
	 * Klienta odpowiedzialny za wymiane informacji z serwerem gry
	 */
	private ClientController client;
	/**
	 * Przechuje kolor przypisany do tego klienta
	 */
	private FigureColor clientColor;
	/**
	 * Zawiera informacje czy teraz jest ruch tego klienta
	 */
	private boolean isClientMove;

	/**
	 * Storzenie widoku klienta.
	 */
	public ClientView()
	{
		rightPanel = new JPanel();
		boardPanel = new JPanel();
		boardPanels = new JPanel[8][8];
		labelServerIP = new JLabel("Server IP Adress: ");
		labelServerPort = new JLabel("Server Port: ");
		labelClientColor = new JLabel("Your Color: ");
		labelClientStatus = new JLabel("Status: ");
		textServerIP = new JTextField("localhost", 1);
		textServerPort = new JTextField("4444", 1);
		textClientColor = new JTextField(1);
		textClientStatus = new JTextField(1);
		buttonConnect = new JButton("Connect");
		buttonDisconnect = new JButton("Disconnect");

		boardPanel.setBounds(0, 0, 500, 500);
		boardPanel.setLayout(new GridLayout(8, 8));
		rightPanel.setBounds(520, 20, 300, 200);
		rightPanel.setLayout(new GridLayout(6, 2, 30, 10));
		textClientStatus.setText("Disconnected");
		buttonDisconnect.setEnabled(false);
		textClientStatus.setEditable(false);
		textClientColor.setEditable(false);
		setLayout(null);

		for (int i = 0; i < 8; i++)
			for (int j = 0; j < 8; j++)
			{
				boardPanels[i][j] = new JPanel(new BorderLayout());
				boardPanels[i][j].setName(String.valueOf(8 * i + j));
				if (i % 2 == 0)
					boardPanels[i][j].setBackground(j % 2 == 0 ? Color.white
							: Color.blue);
				else
					boardPanels[i][j].setBackground(j % 2 == 0 ? Color.blue
							: Color.white);
				boardPanel.add(boardPanels[i][j]);
			}

		this.addMouseListener(new MouseAdapter()
		{

			public void mousePressed(MouseEvent e)
			{
				if (isClientMove)
				{
					Component box = findComponentAt(e.getX(), e.getY());
					if (box instanceof JLabel)
						box = box.getParent();
					if (box.getName() != null)
					{
						ClientMessage m = new ClientMessageClick(
								new Position(
										Integer.valueOf(box.getName()) / 8,
										Integer.valueOf(box.getName()) % 8));
						client.sendMessage(m);
					}
				}
			}
		});

		buttonConnect.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{

				buttonConnect.setEnabled(false);
				textServerIP.setEnabled(false);
				textServerPort.setEnabled(false);

				textClientStatus.setText("Connecting...");
				startClient(textServerIP.getText(), textServerPort.getText());

				buttonDisconnect.setEnabled(true);
			}
		});

		buttonDisconnect.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{

				buttonDisconnect.setEnabled(false);
				client.disconnet();
				textClientStatus.setText("Disconnected");
				textServerIP.setEnabled(true);
				textServerPort.setEnabled(true);
				buttonConnect.setEnabled(true);

			}
		});
		rightPanel.add(labelServerIP);
		rightPanel.add(textServerIP);
		rightPanel.add(labelServerPort);
		rightPanel.add(textServerPort);
		rightPanel.add(buttonConnect);
		rightPanel.add(buttonDisconnect);
		rightPanel.add(labelClientColor);
		rightPanel.add(textClientColor);
		rightPanel.add(labelClientStatus);
		rightPanel.add(textClientStatus);
		add(boardPanel);
		add(rightPanel);

	}

	/**
	 * Stworzenie nowej instancji klienta do polaczenia z serwerem gry
	 * @param serverName
	 * @param port
	 */
	public void startClient(String serverName, String port)
	{
		client = new ClientController(this, serverName, Integer.valueOf(port));
		new Thread(client).start();
	}

	public JTextField getTextClientColor()
	{
		return textClientColor;
	}

	public JTextField getTextClientStatus()
	{
		return textClientStatus;
	}

	public JPanel[][] getBoardPanels()
	{
		return boardPanels;
	}

	public JButton getButtonDisconnect()
	{
		return buttonDisconnect;
	}

	public void setClientColor(FigureColor clientColor)
	{
		this.clientColor = clientColor;
	}

	public FigureColor getClientColor()
	{
		return clientColor;
	}

	public void setClientMove(boolean isClientMove)
	{
		this.isClientMove = isClientMove;
	}

}
